import { app, BrowserWindow, shell, ipcMain, Menu, Notification } from 'electron'
import { release } from 'node:os'
import { join, dirname } from 'node:path'
import { fileURLToPath } from 'node:url'
import koffi from 'koffi';
import { log } from 'node:console';
import { io } from "socket.io-client";
import {globalShortcut} from 'electron';

const fs = require("fs");
const nodeXlsx = require("node-xlsx");
var iconv = require('iconv-lite');

// 隐藏顶部菜单
Menu.setApplicationMenu(null);

process.env.DIST_ELECTRON = join(__dirname, '..')
process.env.DIST = join(process.env.DIST_ELECTRON, '../dist')
process.env.VITE_PUBLIC = process.env.VITE_DEV_SERVER_URL
    ? join(process.env.DIST_ELECTRON, '../public')
    : process.env.DIST

// Disable GPU Acceleration for Windows 7
if (release().startsWith('6.1')) app.disableHardwareAcceleration()

// Set application name for Windows 10+ notifications
if (process.platform === 'win32') app.setAppUserModelId(app.getName())

if (!app.requestSingleInstanceLock()) {
    app.quit()
    process.exit(0)
}

// Remove electron security warnings
// This warning only shows in development mode
// Read more on https://www.electronjs.org/docs/latest/tutorial/security
// process.env['ELECTRON_DISABLE_SECURITY_WARNINGS'] = 'true'

let win: BrowserWindow | null = null
// Here, you can also use other preload
const preload = join(__dirname, '../preload/index.js')
const url = process.env.VITE_DEV_SERVER_URL
const indexHtml = join(process.env.DIST, 'index.html')

async function createWindow() {
    win = new BrowserWindow({
        title: 'Main window',
        // frame:false,  // 取消自带的关闭、最大最小化
        // resizable: false,  // 禁止改变窗口大小
        fullscreen: false,  // 窗口全屏
        // movable: false,  // 窗口是否可被用户移动
        // autoHideMenuBar: true,  // 窗口菜单栏隐藏,单击 Alt 显示
        // show: false,
        icon: join(process.env.VITE_PUBLIC, 'favicon.ico'),
        webPreferences: {
            preload,
            // Warning: Enable nodeIntegration and disable contextIsolation is not secure in production
            // nodeIntegration: true,

            // Consider using contextBridge.exposeInMainWorld
            // Read more on https://www.electronjs.org/docs/latest/tutorial/context-isolation
            // contextIsolation: false,
        },
    })
    // 打包后弹出调试框
    // win.webContents.openDevTools()

    win.maximize();
    if (process.env.VITE_DEV_SERVER_URL) { // electron-vite-vue#298
        win.loadURL(url)
        // Open devTool if the app is not packaged
        // win.webContents.openDevTools()
    } else {
        win.loadFile(indexHtml)
    }

    // Test actively push message to the Electron-Renderer
    win.webContents.on('did-finish-load', () => {
        win?.webContents.send('main-process-message', new Date().toLocaleString())
    })

    // Make all links open with the browser, not with the application
    win.webContents.setWindowOpenHandler(({ url }) => {
        if (url.startsWith('https:')) shell.openExternal(url)
        return { action: 'deny' }
    })
    // win.webContents.on('will-navigate', (event, url) => { }) #344
}

// app.whenReady().then(createWindow)
app.on('ready', async () => {
    // 设置快捷键打开控制台
    globalShortcut.register('Alt+d+b', function () {
        win.webContents.openDevTools()
    })
    createWindow();
})


app.on('window-all-closed', () => {
    win = null
    if (process.platform !== 'darwin') app.quit()
})

app.on('second-instance', () => {
    if (win) {
        // Focus on the main window if the user tried to open another
        if (win.isMinimized()) win.restore()
        win.focus()
    }
})

app.on('activate', () => {
    const allWindows = BrowserWindow.getAllWindows()
    if (allWindows.length) {
        allWindows[0].focus()
    } else {
        createWindow()
    }
})

// New window example arg: new windows url
ipcMain.handle('open-win', (_, arg) => {
    const childWindow = new BrowserWindow({
        webPreferences: {
            preload,
            nodeIntegration: true,
            contextIsolation: false,
        },
    })

    if (process.env.VITE_DEV_SERVER_URL) {
        childWindow.loadURL(`${url}#${arg}`)
    } else {
        childWindow.loadFile(indexHtml, { hash: arg })
    }
})

ipcMain.handle("doSomething", async (event, args) => {
    return '这是返回的结果'
});

// txt文件读取
ipcMain.handle("fs", async (event, args) => {
    return new Promise((resolve, reject) => {
        fs.readFile("electron/dll/wz.txt", { encoding: 'binary' }, function (err, data) {
            if (err) {
                console.log(err.message); // 读取失败
                reject(err);
            } else {
                let buf = Buffer.from(data, 'binary');
                data = iconv.decode(buf, 'GBK'); //使用iconv转成中文格式
                resolve(data);
            }
        });
    });
});

ipcMain.handle("excelImport", async (event, args) => {
    let path = args;
    let sheets = nodeXlsx.parse(path);
    return sheets;
});